nanopyx.core.transform.image_shift

Combination of functions for shifting an image, using several interpolation methods.

 1"""
 2Combination of functions for shifting an image, using several interpolation methods.
 3"""
 4
 5from scipy.ndimage import shift
 6import numpy as np
 7
 8from ..utils.timeit import timeit2
 9from . import interpolation_bicubic
10from . import interpolation_bilinear
11from . import interpolation_nearest_neighbor
12from . import interpolation_catmull_rom
13from . import interpolation_lanczos
14
15from skimage.transform import AffineTransform, warp
16import cv2
17
18
19@timeit2
20def catmull_rom_shift(image: np.ndarray, dx: float, dy: float):
21    interpolator = interpolation_catmull_rom.Interpolator(image)
22    return interpolator.shift(dx, dy)
23
24
25@timeit2
26def lanczos_shift(image: np.ndarray, dx: float, dy: float):
27    interpolator = interpolation_lanczos.Interpolator(image)
28    return interpolator.shift(dx, dy)
29
30
31@timeit2
32def bicubic_shift(image: np.ndarray, dx: float, dy: float):
33    interpolator = interpolation_bicubic.Interpolator(image)
34    return interpolator.shift(dx, dy)
35
36
37@timeit2
38def bilinear_shift(image: np.ndarray, dx: float, dy: float):
39    interpolator = interpolation_bilinear.Interpolator(image)
40    return interpolator.shift(dx, dy)
41
42
43@timeit2
44def nearest_neighbor_shift(image: np.ndarray, dx: float, dy: float):
45    interpolator = interpolation_nearest_neighbor.Interpolator(image)
46    return interpolator.shift(dx, dy)
47
48
49@timeit2
50def scipy_shift(image: np.ndarray, dx: float, dy: float):
51    return shift(image, (dy, dx))
52
53
54@timeit2
55def skimage_shift(image: np.ndarray, dx: float, dy: float):
56    tform = AffineTransform(translation=(-dx, -dy))
57    return warp(image, tform)
58
59
60@timeit2
61def cv2_shift(image: np.ndarray, dx: float, dy: float):
62    return cv2.warpAffine(
63        image, np.float32([[1, 0, dx], [0, 1, dy]]), image.shape[:2][::-1]
64    )